package cn.itsource.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 登录权限检查
 */
@Slf4j
@Component
public class LoginZuulFilter  extends ZuulFilter {


    @Override
    public String filterType() {
        // 自定义的过滤是什么类型的
        // Zuul 中的标准类型是“pre”用于路由前过滤，
        // “route”用于路由到源，
        // “post”用于路由后过滤器，
        // “error”用于错误处理。
        return "pre"; // 一般自定义的都是前置过滤器
    }

    @Override
    public int filterOrder() {
        // 同类型过滤器的执行顺序
        return -1;
    }

    @Override
    public boolean shouldFilter() {
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();

        // 获取请求的url 通过请求上下文
        String url = request.getRequestURI();
        log.debug("url: ",url);
        if(url.contains("login")||url.contains("register")){
            // 登录 login ，注册 register 页面是不需要拦截
            return false;
        }
        return true; // 返回true 执行run 做过滤检验
    }

    @Override
    public Object run() throws ZuulException {
        //  核心过滤业务
        // 从请求头中获取 token
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();

        String token = request.getHeader("token");
        // 如果请求头中有“token”属性，
        if(StringUtils.hasLength(token)){
            // 我们就认为已经登录成功， 可以继续往下游的服务执行，
            return null;
        }else{
            // 否则就视为请求未登录， 返回错误信息，
            HttpServletResponse response = RequestContext.getCurrentContext().getResponse();
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/json;charset=utf-8");

            Map<String,Object> map = new HashMap<>();
            map.put("status","false");
            map.put("msg","请登录");

            try {
                response.getWriter().println(map);
            } catch (IOException e) {
                e.printStackTrace();
            }

            // 不要执行后面的filter// 阻止filter继续往后执行
            RequestContext.getCurrentContext().setSendZuulResponse(false);
        }

        return null;


    }
}
